package verificacao;
import java.io.Serializable;

import jogador.Jogador;

public class Pontuacao implements Serializable {
	private Jogadorvalor[] pontos_jogadores;

	public Pontuacao(Jogador[] jogadores) {
		assert(jogadores != null);
		this.pontos_jogadores = new Jogadorvalor[jogadores.length];
		for (int i = 0; i < jogadores.length; i++) {
			this.pontos_jogadores[i] = new Jogadorvalor(jogadores[i]);
		}
	}

	public Pontuacao() {

	}

	public void actualizaPontuacaoJogador(Jogador jogador, int pontos) {
		assert(jogador != null);
		for (int i = 0; i < this.pontos_jogadores.length; i++) {
			if (this.pontos_jogadores[i].getJogador().equals(jogador))
				this.pontos_jogadores[i].setValor(this.pontos_jogadores[i]
						.getValor()
						+ pontos);
		}
	}

	// actualiza a pontuacao de um jogador somando o numero de pontos recebido

	public int getPontuacao(Jogador jogador) {
		assert jogador != null;
		for (int i = 0; i < this.pontos_jogadores.length; i++)
			if (this.pontos_jogadores[i].getJogador() == jogador)
				return this.pontos_jogadores[i].getValor();
		return 0;
	}

	// Devolve a pontuacao actual de um jogador

	public Jogador[] getJogadores() {
		Jogador[] jogadores = new Jogador[this.pontos_jogadores.length];
		for (int i = 0; i < this.pontos_jogadores.length; i++) {
			jogadores[i] = this.pontos_jogadores[i].getJogador();
		}
		return jogadores;
	}
	
	public Jogadorvalor[] getJogadoresValor(){
		return this.pontos_jogadores;
	}

	public void actualizaPontuacao(Pontuacao pontuacao) {
		assert pontuacao != null;
		for (int i = 0; i < this.pontos_jogadores.length; i++) {
			this.pontos_jogadores[i].setValor(this.pontos_jogadores[i]
					.getValor()
					+ pontuacao.getPontuacao(this.pontos_jogadores[i]
							.getJogador()));
		}
	}

	// actualiza a pontuacao de todos os jogadores recebendo um objecto da
	// classe pontuacao
	// com a pontua�ao respectiva de cada jogador.

	public Jogador Lider() {
		int max_posicao = 0;
		int max = 0;

		for (int i = 0; i < this.pontos_jogadores.length; i++) {
			if (this.pontos_jogadores[i].getValor() > max) {
				max_posicao = i;
				max = this.pontos_jogadores[i].getValor();
			}
		}
		return this.pontos_jogadores[max_posicao].getJogador();
	}

	// devolve o jogador com o maior numero de pontos

	public void muda(int pontuacao_antiga, int pontuacao_nova) {
		assert (pontuacao_antiga != 0);
		for (int i = 0; i < this.pontos_jogadores.length; i++) {
			this.pontos_jogadores[i].setValor(this.pontos_jogadores[i]
					.getValor()
					/ pontuacao_antiga * pontuacao_nova);
		}
	}

	public void actualizaPontuacaoTodos(int valor) {
		for (int i = 0; i < this.pontos_jogadores.length; i++) {
			this.pontos_jogadores[i].setValor(this.pontos_jogadores[i]
					.getValor()
					+ valor);
		}

	}

	public void setPontuacao(Jogador jogador, int pontos) {
		assert (jogador != null);
		for (int i = 0; i < this.pontos_jogadores.length; i++) {
			if (this.pontos_jogadores[i].getJogador() == jogador)
				this.pontos_jogadores[i].setValor(pontos);
		}
	}
}
